package net.wofly.right.service;

import net.wofly.common.persistence.PageWrapper;
import net.wofly.common.util.ReturnBean;
import net.wofly.right.domain.User;
import net.wofly.right.domain.UserReceivingAddr;
import net.wofly.right.dto.RightUserDto;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

public interface IUserService {

	/**
	 * 增加或修改
	 * 
	 * @param entity
	 * @return
	 */
	public User save(User entity);

	/**
	 * 删除
	 * 
	 * @param entity
	 * @return
	 */
	public void delete(User entity);

	/**
	 * 根据主键ID删除
	 * 
	 * @param key
	 * @return
	 */
	public void delete(String key);

	/**
	 * 根据主键查询
	 * 
	 * @param key
	 * @return
	 */
	public User findOne(String key);
	
	public List<User> findAll();
	
	public Page<User> findAll(Specification specification, Pageable pageable);
	
	public List<User> save(List<User> entityList) ;
	
	public List<User> findByMobile(String mobile);

	public User findByMobileAndPassword(String mobile, String password);

	public User findByEmail(String email);
	
	List<User> findByOrganizationID(String organizationID);
	
	List<User> findByOrganizationIDAndStatus(String organizationID, Integer status);
	
	Page<User> findByOrganizationIDAndStatus(String organizationID, Integer status, Pageable pageable);
	
	List<User> findByNameLike(String name);
	
	List<User> findByNamePinYinLike(String namePinYin);
	
	List<User> findByNameContaining(String name);

    public List<User> findByMobileOrEmail(String mobileOrEmail);

    public List<User> findByMobileOrEmail(String mobile, String email);
    

    List<User> findByFollowUserID(String followUserID);

    List<User> findByFollowUserIDAndStatus(String followUserID, Integer status);
    
    List<User> findByFollowUserIDAndUserID(String followUserID, String userID);
	
	List<User> findByFollowUserIDAndNameLike(String followUserID, String name);
	
	List<User> findByFollowUserIDAndNamePinYinLike(String followUserID, String namePinYin);


    /**
     * 添加一个客户
     * <ul>
     * <li>业务员或团购专员及店员、会计都可以添加一个客户</li>
     * <li>添加客户时，要判断当前添加客户是否存在</li>
     * <li>业务员添加的客户需要会计审核</li>
     * <li>判断当前用户是否有审核添加客户的权限，如果有则直接添加成功</li>
     * </ul>
     *
     * @param user
     */
    public ReturnBean<String> addUser(User user);

    /**
     * 审核客户
     * <ul>
     * <li>通过添加进来的客户，需要有审核权限的用户审核才能使用</li>
     * <li>需要将审核记录写入客户注册审核表中</li>
     * </ul>
     *
     * @param user
     */
    public ReturnBean<String> checkUser(User user, String userID);

    /**
     * 完全注册
     * <ul>
     * <li>此时才会真正写客户表（User）。</li>
     * <li>注册完成后，用户需要完善用户信息。</li>
     * <li>对于公众来说只需要完善，其完善的是：姓名，性别、出生年月、Email</li>
     * <li>对于单位客户来说，其要完善单位名称、单位地址、联系人姓、性别、出生年月、email、公司两张照片等信息。注册手机为联系人手机</li>
     * </ul>
     *
     * @param mobile
     * @param password
     * @param verifyCode
     */
    public ReturnBean<String> finishRegisterByMobile(String mobile, String password, String verifyCode);

    /**
     * 登陆
     * <ul>
     * <li>目前只有手机，可以支持根据帐号来判断登陆帐号类型</li>
     * <li>前后交互时，密码加密处理</li>
     * </ul>
     *
     * @param accountID
     * @param password
     */
    public ReturnBean<User> login(HttpServletRequest request, String accountID, String password);

    /**
     * 登出
     *
     * @param userID
     */
    public ReturnBean<String> logout(String userID);

    /**
     * 发送手机验证码
     * <ul>
     * <li></li>
     * </ul>
     *
     * @param mobile
     */
    public ReturnBean<String> sendMobileVerifyCode(String mobile);
    
    /**
     * 发送注册用户手机验证码
     * <ul>
     * <li></li>
     * </ul>
     *
     * @param mobile
     */
    public ReturnBean<String> sendMobileVerifyCodeForReg(String mobile);

    /**
     * 删除员工维护客户
     *
     * @param userFollowID
     */
    public ReturnBean<String> delUserFollow(String userFollowID);

    /**
     * 获取所有客户
     *
     * @param status
     * @param pageNum
     * @param pageSize
     */
    public ReturnBean<PageWrapper<User>> getAllUser(Integer status, Integer pageNum, Integer pageSize);

    /**
     * 获取提定员工的维护客户
     *
     * @param employeeID
     */
    public ReturnBean<List<User>> getMyUserFollow(String employeeID);

    /**
     * 设置员工维护的客户
     * 
     * @param employeeUserID
     * @param customerUserID
     * @return
     */
    public ReturnBean<String> setUserFollow(String employeeUserID, String customerUserID);
    
    
    
    /**
     * 获取所有销售
     * 
     * 列出所有流通及酒店销售人员
     * 
     * @return
     */
    public ReturnBean<List<User>> getAllSales() ;
    
    /**
     * 添加个人客户 
     * 个人客户本人即为法人
     * 
     * @return
     */
    public ReturnBean<String> addPersonalCustom(User user) ;
    
    /**
     * 获取当前销售对应订单类型下的用户列表
     * 
     * 用于店员端，订单确认页中，选择客户
     * 
     * @param orderType
     * @param saleUserID
     * @return
     */
    public ReturnBean<List<UserReceivingAddr>> getUserForOrder(String orderType ,String saleUserID) ;
    
    /**
     * 根据客户的userID查找客户的维护人
     * 
     * 在工作流中会用到。进行工作流任务分配时，客户自助下单时，需要相应的维护人确认是否收款
     * 
     * @param customUserID
     * @return
     */
    public String findFollowUserByCustomer(String customUserID) ;
    
    /**
     * 根据组织机构ID查找组织机构下的人员列表
     * 
     * 在工作流中会用到。进行工作流任务分配时，会员客户自助下单时，其选择店面后，相应的店面人员要进行相应的任务操作
     * 
     * @param organizationID
     * @return
     */
    public ReturnBean<List<User>> findShopUserByorganizationID(String organizationID) ;


	/**
	 * 获取所有公司内部用户
	 *
	 * @param name
	 * @param mobile
	 * @param roleID
	 * @param organizationID
	 * @param pageNum
	 * @param pageSize
     * @return
     */
	ReturnBean<PageWrapper<RightUserDto>> findAllUser(String name, String mobile, String roleID, String organizationID, Integer pageNum, Integer pageSize);

    /**
     * 
     * 
     * 
     * @param userName
     * @param mobile
     * @param organizationID
     * @param roleID
     * @param warehouseFlag
     * @param warehouseType
     * @return
     */
    public ReturnBean<User> saveUserForUserManage(String userName, String mobile ,String organizationID ,String roleID) ;
    
	/**
	 * 
	 * 
	 * 
	 * @param userName
	 * @param mobile
	 * @param organizationID
	 * @param roleID
	 * @param warehouseFlag
	 * @param warehouseType
	 * @return
	 */
    public ReturnBean<User> updateUserForUserManage(String userID ,String userName, String mobile ,String organizationID ,String roleID) ;
    
    /**
     * 
     * 
     * @param userID
     * @return
     */
    public ReturnBean<String> delUser(String userID) ;
    
    
    public ReturnBean<List<User>> getCustomerForCustomerSearch() ;
    
    
    /**
     * 更新用户手机号
     * 后台管理功能，只能为企业内部员工
     * 
     * @param userID
     * @param mobile
     * @return
     */
    public ReturnBean<String> updateUserMobile(String userID,String mobile) ;

    ReturnBean<User> loginForMobile(HttpServletRequest request, String accountID, String password);
}
